// 抽象类：包含抽象方法（抽象方法一般没有任何具体内容的实现！），也可以包含实例方法，抽象类不可以被实例化，为了让子类进行实例化，实现内容的方法
// 抽象类的作用或者是目的都是为了子类服务的！   
(() => {
    // 定义一个抽象类
    abstract class Animal {
        // 抽象属性
        // abstract name: string

        // 抽象方法
        abstract eat()

        // 这种是报错的！
        // abstract eat() {
        //     console.log('就是吃！');
        // }

        // 实例方法
        sayHi() {
            console.log('你好！');
        }
    }

    // 定义一个子类（派生类）Dog
    class Dog extends Animal {
        // name: string = '小爱'
        // 重新实现抽象类中的方法，这个方法就是dog类的实例方法了！
        eat() {
            console.log('舔着吃，真好吃！');
        }
    }

    // 实例化dog类
    const dog = new Dog()
    dog.eat()
    dog.sayHi()
    // console.log(dog.name);


    // 不能实例化抽象类的对象
    // const ani:Animal = new Animal()
})()